package com.example.statemachine;

import com.example.statemachine.event.BaseEvent;
import com.example.statemachine.status.BaseStatus;

import java.util.HashMap;
import java.util.Map;

/**
 * @author renyitong
 * @version 1.0.0
 * @createTime 2024年01月11日
 * @Description 状态机
 */
public class StateMachine<S extends BaseStatus, E extends BaseEvent> {

    private final Map<StatusEventPair<S, E>, S> statusEventSMap = new HashMap<>();

    /**
     * 只接受指定的当前状态下，指定的事件触发，可以达到的指定目标状态
     */
    public void accept(S sourceStatus, E event, S targetStatus) {
        statusEventSMap.put(new StatusEventPair<>(sourceStatus, event), targetStatus);
    }

    /**
     * 通过源状态和事件，获取目标状态
     */
    public S getTargetStatus(S sourceStatus, E event) {
        return statusEventSMap.get(new StatusEventPair<>(sourceStatus, event));
    }

}
